﻿using System;
using System.Collections.Generic;
using System.Linq;
using Business_Layer.Data_Access_Layer;

namespace Business_Layer.Business_Layer.Sprints
{
    public class ControladorSprints
    {
        private readonly DB_SAPDataContext _dbSap = new DB_SAPDataContext();

        private IEnumerable<SPRINTS> ObtenerSprintsProyecto(string proyecto)
        {
            return
                _dbSap.SPRINTS.Where(
                    x => x.PROYECTOS.PROYECTOS_nombre.Equals(proyecto))
                      .ToList();
        }

        private IEnumerable<PROYECTOS> ObtenerProyectos()
        {
            return _dbSap.PROYECTOS.Select(x => x).ToList();
        }

        public string CrearContenidoSprints(string proyecto)
        {
            var renderSprints = ObtenerSprintsProyecto(proyecto)
                .Aggregate(string.Empty, (current, sprint) => current + (
                                                                            "<tr>" +
                                                                            "<td>" +
                                                                            sprint.SPRINT_descripcion +
                                                                            "</td>" +
                                                                            "<td>" +
                                                                            sprint.SPRINT_numero +
                                                                            "</td>" +
                                                                            "<td>" +
                                                                            sprint.SPRINT_fechaInicio +
                                                                            "</td>" +
                                                                            "<td>" +
                                                                            "<span id='btnAsignarRequerimientos" +
                                                                            "' data-id='" +
                                                                            sprint.SPRINT_ID +
                                                                            "' data-proyecto='" +
                                                                            sprint.PROYECTOS.PROYECTOS_nombre +
                                                                            "'" +
                                                                            "'><img src='/Misc/imagenes/file-complete24.png' /></span>" +
                                                                            "<span id='btnEditarSprint" +
                                                                            "' data-id='" +
                                                                            sprint.SPRINT_ID +
                                                                            "' data-proyecto='" +
                                                                            sprint.PROYECTOS.PROYECTOS_nombre +
                                                                            "' data-descripcion='" +
                                                                            sprint.SPRINT_descripcion +
                                                                            "' data-numero='" +
                                                                            sprint.SPRINT_numero +
                                                                            "' data-fechaInicio='" +
                                                                            sprint.SPRINT_fechaInicio.ToString(
                                                                                "dd/MM/yyyy") +
                                                                            "'>" +
                                                                            "<img src='/Misc/imagenes/edit_icon_24.png' />" +
                                                                            "</span>" +
                                                                            "<span id='btnEliminarSprint' data-id='" +
                                                                            sprint.SPRINT_ID +
                                                                            "'>" +
                                                                            "<img src='/Misc/imagenes/cancel.png' />" +
                                                                            "</span></td>" +
                                                                            "</tr>"));

            return
                "<table id='tblSprints''>" +
                "<tr>" +
                "<th>Descripción</th>" +
                "<th>Número</th>" +
                "<th>Fecha Inicio</th>" +
                "<th></th>" +
                "</tr>" +
                renderSprints +
                "</table>";
        }

        public string CrearDialogoAgregarSprint()
        {
            var dialogo =
                "<table>" +
                "<tr>" +
                "<td>Proyecto: </td>" +
                "<td>" + CargarProyectos("selectProyectosDialogo") + "</td>" +
                "</tr>" +
                "<tr>" +
                "<td>Descripción: </td>" +
                "<td>" +
                "<input type='text' id='txtDescripcion' maxlength='50' />" +
                "</td>" +
                "</tr>" +
                "<tr>" +
                "<td>Número: </td><td><input type='text' id='txtNumero' maxlength='10' /></td>" +
                "</tr>" +
                "<tr>" +
                "<td>Fecha Inicio: </td><td><input type='text' id='txtFechaInicio' readonly='readonly'></td>" +
                "</tr>" +
                "</table>";

            return dialogo;
        }

        public string RegistrarSprint(SPRINTS sprint, string proyecto)
        {
            try
            {
                var proyectoId = _dbSap.PROYECTOS.Single(x => x.PROYECTOS_nombre.Equals(proyecto)).PROYECTOS_ID;

                sprint.SPRINT_PROYECTO_ID = proyectoId;

                _dbSap.SPRINTS.InsertOnSubmit(sprint);
                _dbSap.SubmitChanges();

                return "Sprint registrado";
            }
            catch
            {
                return "Sprint no registrado";
            }
        }

        public string CargarProyectos(string id)
        {
            var listaProyectos = ObtenerProyectos()
                .Aggregate(string.Empty,
                           (current, proyecto) =>
                           current + ("<option>" + proyecto.PROYECTOS_nombre +
                                      "</option>"));

            return "<select id='" + id + "'>" + listaProyectos + "</select>";
        }

        public string ModificarSprint(SPRINTS sprint, string proyecto)
        {
            try
            {
                var sprintModificar =
                    _dbSap.SPRINTS.FirstOrDefault(x => x.SPRINT_ID == sprint.SPRINT_ID);

                var proyectoId = _dbSap.PROYECTOS.Single(x => x.PROYECTOS_nombre.Equals(proyecto)).PROYECTOS_ID;

                if (sprintModificar != null)
                {
                    sprint.SPRINT_PROYECTO_ID = proyectoId;
                    sprintModificar.SPRINT_descripcion = sprint.SPRINT_descripcion;
                    sprintModificar.SPRINT_fechaInicio = sprint.SPRINT_fechaInicio;
                    sprintModificar.SPRINT_numero = sprint.SPRINT_numero;

                    _dbSap.SubmitChanges();
                    return "Sprint editado";
                }

                return "Sprint no editado";
            }
            catch
            {
                return "Sprint no editado";
            }
        }

        public string EliminarSprint(int id)
        {
            try
            {
                var sprint = _dbSap.SPRINTS.Single(x => x.SPRINT_ID == id);
                _dbSap.SPRINTS.DeleteOnSubmit(sprint);
                _dbSap.SubmitChanges();

                return "Sprint eliminado";
            }
            catch
            {
                return "Sprint no eliminado";
            }
        }

        public string CrearDialogoAsignarRequerimientos(int id, string nombreProyecto)
        {
            var listaRequerimientos =
                _dbSap.REQUERIMIENTOS.Where(
                    x => x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(nombreProyecto))
                      .ToList();


            var listaRequerimientosDisponibles = new List<REQUERIMIENTOS>();
            var listaRequerimientosUtilizados = new List<REQUERIMIENTOS>();

            foreach (var proyecto in listaRequerimientos)
            {
                foreach (var req in proyecto.PROYECTOS_REQUERIMIENTOS)
                {
                    if (!_dbSap.REQUERIMIENTOS_SPRINTS.Any(
                        x => x.REQUERIMIENTO_ID == req.REQUERIMIENTO_ID))
                        listaRequerimientosDisponibles.Add(proyecto);
                }
            }

            var requerimientosSprints = _dbSap.REQUERIMIENTOS_SPRINTS.Select(x => x.REQUERIMIENTOS).ToList();

            foreach (var proyecto in requerimientosSprints)
            {
                foreach (var p in proyecto.REQUERIMIENTOS_SPRINTS)
                {
                    if (p.SPRINT_ID == id) listaRequerimientosUtilizados.Add(proyecto);
                }
            }

            var listado =
                listaRequerimientosDisponibles.SelectMany(requerimiento => requerimiento.PROYECTOS_REQUERIMIENTOS)
                                          .Aggregate(string.Empty,
                                                     (current, nombre) =>
                                                     current +
                                                     ("<tr><td><input type='checkbox' name='checkBoxRequerimientosDisponibles' value='" +
                                                      nombre.REQUERIMIENTOS.REQUERIMIENTOS_ID + "' /></td><td>" +
                                                      nombre.REQUERIMIENTOS.REQUERIMIENTOS_descripcion + "</td></tr>"));

            var listadoAux =
                listaRequerimientosUtilizados.SelectMany(requerimiento => requerimiento.PROYECTOS_REQUERIMIENTOS)
                                          .Aggregate(string.Empty,
                                                     (current, nombre) =>
                                                     current +
                                                     ("<tr><td><input type='checkbox' checked name='checkBoxRequerimientosUtilizados' checked value='" +
                                                      nombre.REQUERIMIENTOS.REQUERIMIENTOS_ID + "' /></td><td>" +
                                                      nombre.REQUERIMIENTOS.REQUERIMIENTOS_descripcion + "</td></tr>"));

            var requerimientosDisponibles =
                "<div class='input-wrapper'>Lista de Requerimientos disponibles</div><div class='input-wrapper'><table>" +
                listado + "</table></div>";

            var requerimientosUtilizados = "<div class='input-wrapper'>Lista de Requerimientos utilizados</div><div class='input-wrapper'><table>" +
                   listadoAux + "</table></div>";

            return requerimientosDisponibles + requerimientosUtilizados;
        }

        public string AsignarRequerimientos(int id, string valores)
        {
            try
            {
                var requerimientosSprints =
                    valores.Split(Convert.ToChar(",")).Select(valor => new REQUERIMIENTOS_SPRINTS
                        {
                            SPRINT_ID = id,
                            REQUERIMIENTO_ID = Convert.ToInt32(valor)
                        }).ToList();

                _dbSap.REQUERIMIENTOS_SPRINTS.InsertAllOnSubmit(requerimientosSprints);
                _dbSap.SubmitChanges();

                return "Cambios realizados";
            }
            catch
            {
                return "Error al realizar los cambios";
            }
        }

        public string DenegarRequerimientos(int id, string valores)
        {
            try
            {
                foreach (var valor in valores.Split(Convert.ToChar(",")))
                {
                    _dbSap.REQUERIMIENTOS_SPRINTS.Where(x => x.REQUERIMIENTO_ID == Convert.ToInt32(valor))
                          .ToList()
                          .ForEach(x => _dbSap.REQUERIMIENTOS_SPRINTS.DeleteOnSubmit(x));
                }

                _dbSap.SubmitChanges();

                return "Cambios realizados";
            }
            catch
            {
                return "Error al realizar los cambios";
            }
        }
    }
}